home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / cli / FixNI.lha / src / dosio.i < prev    next >
Text File  |  2000-06-29  |  7KB  |  340 lines

  1.  IFND DOSIO_I
  2. DOSIO_I=1
  3. ;*---------------------------------------------------------------------------
  4. ;  :Author.    Bert Jahn
  5. ;  :Contens.    macros for input/output via dos.library
  6. ;  :EMail.    wepl@kagi.com
  7. ;  :Address.    Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
  8. ;  :Version.    $Id: dosio.i 1.6 2000/06/28 22:41:15 jah Exp jah $
  9. ;  :History.    30.12.95 separated from WRip.asm
  10. ;        18.01.96 IFD Label replaced by IFD Symbol
  11. ;             because Barfly optimize problems
  12. ;        20.01.96 _CheckBreak separated from Wrip
  13. ;        21.07.97 _FGetS added
  14. ;        09.11.97 _GetS added
  15. ;             _FlushInput added
  16. ;        27.12.99 _PrintLn shortend
  17. ;             _CheckBreak enhanced (nested checks)
  18. ;        13.01.00 _GetKey added
  19. ;        28.06.00 gloabal variable from _GetKey removed
  20. ;  :Requires.    -
  21. ;  :Copyright.    This program is free software; you can redistribute it and/or
  22. ;        modify it under the terms of the GNU General Public License
  23. ;        as published by the Free Software Foundation; either version 2
  24. ;        of the License, or (at your option) any later version.
  25. ;        This program is distributed in the hope that it will be useful,
  26. ;        but WITHOUT ANY WARRANTY; without even the implied warranty of
  27. ;        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  28. ;        GNU General Public License for more details.
  29. ;        You can find the full GNU GPL online at: http://www.gnu.org
  30. ;  :Language.    68000 Assembler
  31. ;  :Translator.    Barfly V1.130
  32. ;---------------------------------------------------------------------------*
  33. *##
  34. *##    dosio.i
  35. *##
  36. *##    _PrintLn    outputs a linefeed
  37. *##    _PrintArgs    outputs formatstring(a0) expanded from argarray(a1)
  38. *##    _PrintInt    outputs a longint (d0)
  39. *##    _Print        outputs a string(a0)
  40. *##    _FlushInput    flushes the input stream
  41. *##    _FlushOutput    flushes the output stream
  42. *##    _CheckBreak    --> true(d0) if ^C was pressed
  43. *##    _FGetS        fh(d1) buffer(d2) buflen(d3) --> buffer(d0)
  44. *##    _GetS        buffer(a0) buflen(d0) --> buffer(d0)
  45. *##    _GetKey        --> key(d0)
  46.  
  47.     dc.b    "$Id: dosio.i 1.6 2000/06/28 22:41:15 jah Exp jah $",10,0
  48.     EVEN
  49.  
  50.         IFND    STRINGS_I
  51.             INCLUDE    strings.i
  52.         ENDC
  53.  
  54. ;----------------------------------------
  55. ; Zeilenschaltung
  56. ; IN :    -
  57. ; OUT :    -
  58.  
  59. PrintLn        MACRO
  60.     IFND    PRINTLN
  61. PRINTLN = 1
  62.         IFND    PRINT
  63.             Print
  64.         ENDC
  65. _PrintLn    lea    (.nl),a0
  66.         bra    _Print
  67. .nl        dc.b    10,0
  68.     ENDC
  69.         ENDM
  70.  
  71. ;----------------------------------------
  72. ; Gibt FormatString gebuffert aus
  73. ; IN :    A0 = CPTR FormatString
  74. ;    A1 = STRUCT Array mit Argumenten
  75. ; OUT :    -
  76.  
  77. PrintArgs    MACRO
  78.     IFND    PRINTARGS
  79. PRINTARGS = 1
  80. _PrintArgs    movem.l    d2/a6,-(a7)
  81.         move.l    a0,d1
  82.         move.l    a1,d2
  83.         move.l    (gl_dosbase,GL),a6
  84.         jsr    (_LVOVPrintf,a6)
  85.         movem.l    (a7)+,d2/a6
  86.         rts
  87.     ENDC
  88.         ENDM
  89.  
  90. ;----------------------------------------
  91. ; Gibt LongInt gebuffert aus
  92. ; IN :    D0 = LONG
  93. ; OUT :    -
  94.  
  95. PrintInt    MACRO
  96.     IFND    PRINTINT
  97. PRINTINT = 1
  98. _PrintInt    clr.l    -(a7)
  99.         move.l    #"%ld"<<8+10,-(a7)
  100.         move.l    a7,a0
  101.         move.l    d0,-(a7)
  102.         move.l    a7,a1
  103.         bsr    _PrintArgs
  104.         add.w    #12,a7
  105.         rts
  106.     ENDC
  107.         ENDM
  108.  
  109. ;----------------------------------------
  110. ; Gibt String gebuffert aus
  111. ; IN :    A0 = CPTR String
  112. ; OUT :    -
  113.  
  114. Print        MACRO
  115.     IFND    PRINT
  116. PRINT = 1
  117.         IFND    PRINTARGS
  118.             PrintArgs
  119.         ENDC
  120.  
  121. _Print        sub.l    a1,a1
  122.         bra    _PrintArgs
  123.     ENDC
  124.         ENDM
  125.  
  126. ;----------------------------------------
  127. ; Löschen der Ausgabepuffer
  128. ; IN :    -
  129. ; OUT :    -
  130.  
  131. FlushOutput    MACRO
  132.     IFND    FLUSHOUTPUT
  133. FLUSHOUTPUT = 1
  134. _FlushOutput    move.l    a6,-(a7)
  135.         move.l    (gl_dosbase,GL),a6
  136.         jsr    (_LVOOutput,a6)
  137.         move.l    d0,d1
  138.         beq    .err
  139.         jsr    (_LVOFlush,a6)
  140. .err        move.l    (a7)+,a6
  141.         rts
  142.     ENDC
  143.         ENDM
  144.  
  145. ;----------------------------------------
  146. ; IN :    -
  147. ; OUT :    -
  148.  
  149. FlushInput    MACRO
  150.     IFND    FLUSHINPUT
  151. FLUSHINPUT = 1
  152. _FlushInput    move.l    a6,-(a7)
  153.         move.l    (gl_dosbase,GL),a6
  154.         jsr    (_LVOInput,a6)
  155.         move.l    d0,d1
  156.         beq    .err
  157.         jsr    (_LVOFlush,a6)
  158. .err        move.l    (a7)+,a6
  159.         rts
  160.     ENDC
  161.         ENDM
  162.  
  163. ;----------------------------------------
  164. ; print string "break"
  165. ; IN :    -
  166. ; OUT :    -
  167.  
  168. PrintBreak    MACRO
  169.     IFND    PRINTBREAK
  170. PRINTBREAK = 1
  171.     IFND    PRINT
  172.         Print
  173.     ENDC
  174. _PrintBreak    lea    (.break),a0
  175.         bra    _Print
  176. .break        dc.b    "*** User Break ***",10,0
  177.         EVEN
  178.     ENDC
  179.         ENDM
  180.  
  181. ;----------------------------------------
  182. ; Check break (CTRL-C)
  183. ; IN :    -
  184. ; OUT :    d0 = BOOL break
  185.  
  186. CheckBreak    MACRO
  187.     IFND    CHECKBREAK
  188. CHECKBREAK=1
  189.     IFND    PRINTBREAK
  190.         PrintBreak
  191.     ENDC
  192. _CheckBreak    move.l    a6,-(a7)
  193.     IFD gl_break
  194.         tst.b    (gl_break,GL)
  195.         bne    .b
  196.     ENDC
  197.         move.l    #SIGBREAKF_CTRL_C,d1
  198.         move.l    (gl_dosbase,GL),a6
  199.         jsr    (_LVOCheckSignal,a6)
  200.         tst.l    d0
  201.         beq    .end
  202.         bsr    _PrintBreak
  203.     IFD gl_break
  204.         st    (gl_break,GL)
  205.     ENDC
  206. .b        moveq    #-1,d0
  207. .end        move.l    (a7)+,a6
  208.         rts
  209.     ENDM
  210.  
  211. ;----------------------------------------
  212. ; get line from file
  213. ; remove all LF,CR,SPACE,TAB from the end of line
  214. ; IN :    D1 = BPTR  fh
  215. ;    D2 = APTR  buffer
  216. ;    D3 = ULONG buffer size
  217. ; OUT :    D0 = ULONG buffer or 0 on error/EOF
  218.  
  219. FGetS    MACRO
  220.     IFND    FGETS
  221. FGETS=1
  222.         IFND    STRLEN
  223.             StrLen
  224.         ENDC
  225. _FGetS        movem.l    d3/a6,-(a7)
  226.         subq.l    #1,d3            ;due a bug in V36/V37
  227.         move.l    (gl_dosbase,GL),a6
  228.         jsr    (_LVOFGets,a6)
  229.         move.l    d0,-(a7)
  230.         beq    .end
  231.     ;remove LF,CR,SPACE,TAB from the end
  232.         move.l    (a7),a0
  233.         bsr    _StrLen
  234. .len        tst.l    d0
  235.         beq    .end
  236.         move.l    (a7),a0
  237.         cmp.b    #10,(-1,a0,d0)        ;LF
  238.         beq    .cut
  239.         cmp.b    #13,(-1,a0,d0)        ;CR
  240.         beq    .cut
  241.         cmp.b    #" ",(-1,a0,d0)        ;SPACE
  242.         beq    .cut
  243.         cmp.b    #"    ",(-1,a0,d0)    ;TAB
  244.         bne    .end
  245. .cut        clr.b    (-1,a0,d0)
  246.         subq.l    #1,d0
  247.         bra    .len
  248. .end        movem.l    (a7)+,d0/d3/a6
  249.         rts
  250.     ENDC
  251.         ENDM
  252.  
  253. ;----------------------------------------
  254. ; get line from stdin
  255. ; remove all LF,CR,SPACE,TAB from the end of line
  256. ; IN :    D0 = ULONG buffer size
  257. ;    A0 = APTR  buffer
  258. ; OUT :    D0 = ULONG buffer or 0 on error/EOF
  259.  
  260. GetS    MACRO
  261.     IFND    GETS
  262. GETS=1
  263.         IFND    FGETS
  264.             FGetS
  265.         ENDC
  266. _GetS        movem.l    d2-d3/a6,-(a7)
  267.         move.l    d0,d3            ;buffer size
  268.         move.l    a0,d2            ;buffer
  269.         move.l    (gl_dosbase,GL),a6
  270.         jsr    (_LVOInput,a6)
  271.         move.l    d0,d1            ;fh
  272.         bsr    _FGetS
  273.         movem.l    (a7)+,_MOVEMREGS
  274.         rts
  275.     ENDC
  276.         ENDM
  277.  
  278. ;----------------------------------------
  279. ; wait for a key pressed
  280. ; IN:    -
  281. ; OUT:    D0 = ULONG input char (155 = CSI!)
  282.  
  283. GetKey    MACRO
  284.     IFND    GETKEY
  285. GETKEY=1
  286.     IFND    PRINTBREAK
  287.         PrintBreak
  288.     ENDC
  289. _GetKey        movem.l    d2-d5/a6,-(a7)
  290.  
  291.         move.l    (gl_dosbase,GL),a6
  292.         jsr    (_LVOInput,a6)
  293.         move.l    d0,d5                ;d5 = stdin
  294.  
  295.         move.l    d5,d1
  296.         moveq    #1,d2                ;mode = raw
  297.         jsr    (_LVOSetMode,a6)
  298.  
  299.         move.l    d5,d1
  300.         clr.l    -(a7)
  301.         move.l    a7,d2
  302.         moveq    #1,d3
  303.         jsr    (_LVORead,a6)
  304.         move.l    (a7)+,d4
  305.         rol.l    #8,d4
  306.         
  307.         bra    .check
  308.  
  309. .flush        move.l    d5,d1
  310.         subq.l    #4,a7
  311.         move.l    a7,d2
  312.         moveq    #1,d3
  313.         jsr    (_LVORead,a6)
  314.         addq.l    #4,a7
  315.  
  316. .check        move.l    d5,d1
  317.         move.l    #0,d2                ;0 seconds
  318.         jsr    (_LVOWaitForChar,a6)
  319.         tst.l    d0
  320.         bne    .flush
  321.         
  322.         move.l    d5,d1
  323.         moveq    #0,d2                ;mode = con
  324.         jsr    (_LVOSetMode,a6)
  325.         
  326.         cmp.b    #3,d4                ;Ctrl-C pressed?
  327.         bne    .end
  328.         bsr    _PrintBreak
  329.  
  330. .end        move.l    d4,d0
  331.         movem.l    (a7)+,_MOVEMREGS
  332.         rts
  333.     ENDC
  334.         ENDM
  335.  
  336. ;----------------------------------------
  337.     
  338.  ENDC
  339.  
  340.